package com.tcc.util.common;

import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.Month;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期工具类
 *
 * @author tcc
 */
public class DateUtil {

    //暗杀凉快圣诞节
    private String hanhan;

    private String doubi;

    private String shazi;


    // 1-1 将Date类型转换为String(固定格式)
    public static String getStrFromDate(Date date) {
        return new SimpleDateFormat("yyyy-MM-dd").format(date);
    }

    // 1-2 将Date类型转换为String(自定义格式)
    public static String getStrFromDate(Date date, String param) {
        return new SimpleDateFormat(param).format(date);
    }

    // 2-1 将string字符串转换为日期
    public static Date getDateFromStr(String param) throws Exception {
        return new SimpleDateFormat("yyyy-MM-dd").parse(param);
    }

    // 3 计算传入日期到现在共有多少月
    public static int getMonth(Date date) {

        // 日历类
        Calendar instance = Calendar.getInstance(); // 当前时间日历
        // 获取当前时间日期的年和月
        int nowYear = instance.get(Calendar.YEAR);
        int nowMonth = instance.get(Calendar.MONTH);
        // 重新设置日历类日期
        instance.setTime(date);
        // 获取传入日期的年和月
        int year = instance.get(Calendar.YEAR);
        int month = instance.get(Calendar.MONTH);
        return 12 * (nowYear - year) + (nowMonth - month);
    }

    // 4-1 获取年龄（根据出生日期计算年龄）
    public static int getAge(Date date) {

        // 日历类
        Calendar instance = Calendar.getInstance(); // 当前时间日历
        // 获取当前时间日期的年和月
        int nowYear = instance.get(Calendar.YEAR);
        int nowMonth = instance.get(Calendar.MONTH);
        int nowDay = instance.get(Calendar.DAY_OF_MONTH);

        // 重新设置日历类日期
        instance.setTime(date);
        // 获取传入日期的年和月
        int year = instance.get(Calendar.YEAR);
        int month = instance.get(Calendar.MONTH);
        int day = instance.get(Calendar.DAY_OF_MONTH);

        // 数据运算
        int age = nowYear - year;
        if (nowMonth < month) {
            age--;
        }
        if (nowMonth == month && nowDay < day) {
            age--;
        }
        return age;
    }

    // 4-2 LocalDateTime 处理时间问题
    public static int getBirthAge(Date birthday) {
        // 1.获取系统的年月日
        LocalDateTime now = LocalDateTime.now();
        int year = now.getYear();
        Month month = now.getMonth();
        int dayOfMonth = now.getDayOfMonth();
        // 2、出生日期的年月日类型转换
        Instant instant = birthday.toInstant();
        ZoneId zoneId = ZoneId.systemDefault(); // 获取系统所在时区
        LocalDateTime of = instant.atZone(zoneId).toLocalDateTime(); // 将date类型转换成localdatetime类型
        int year1 = of.getYear();
        Month month1 = of.getMonth();
        int dayOfMonth1 = of.getDayOfMonth();
        int age = year - year1;// 年龄

        int compareTo = now.compareTo(of);
        // 还没有到生日月份
        if (month.compareTo(month1) < 0) {
            // 让年龄减小1
            return age--;
        }
        if (month.compareTo(month1) == 0 && dayOfMonth < dayOfMonth1) {
            // 让年龄减小1
            return age--;
        }
        return age;
    }

    // 5.获取传入时间的月初结束时间
    public static Date getFirstDayOfMonth(Date date) {

        // 获取日历类对象
        Calendar instance = Calendar.getInstance();
        // 重新赋值
        instance.setTime(date);
        // 天数改为当月第一天
        instance.set(instance.get(Calendar.YEAR), instance.get(Calendar.MONTH), 1, 0, 0, 0);
        return instance.getTime();
    }

    // 6.获取传入时间的月末结束时间（当月的最后一天凌晨）
    public static Date getLastDayOfMonth(Date date) {

        // 获取日历类对象
        Calendar instance = Calendar.getInstance();
        // 重新赋值
        instance.setTime(date);
        // 对数据进行操作in
        // 月份加一
        instance.add(Calendar.MONTH, 1);
        // 天数改为当月第一天
        instance.set(instance.get(Calendar.YEAR), instance.get(Calendar.MONTH), 1, 0, 0, 0);
        // 秒数减一
        instance.add(Calendar.SECOND, -1);

        return instance.getTime();
    }

    // 7.获取当前时间的指定天数的时间（正数：未来日期；负数：历史日期）
    public static Date offsetDate(int days) {

        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.DAY_OF_MONTH, days);
        return instance.getTime();
    }

    // 8.获取当前季节
    public static String getCurrentSeason() {

        Calendar instance = Calendar.getInstance();
        int month = instance.get(Calendar.MONTH) + 1;
        System.out.println(month);

        // 春3-4-5；夏6-7-8；秋9-10-11；冬12-1-2
        if (month < 9 && month > 2) {
            if (month < 6) {
                return Season.SPRING.getName();
            }
            return Season.SUMMER.getName();
        } else {
            if (month >= 9 && month < 12) {
                return Season.AUTUMN.getName();
            }
            return Season.WINTER.getName();
        }

    }

    // 9.获取人性化时间：例如5分钟之内则显示“刚刚”，其它显示16分钟前、2小时前、3天前、4月前、5年前等
    public static String getDisplayTime(Date date) {
        // 获取传入日期的毫米值 ;从1970-1-1 到date 的毫米值
        long t1 = date.getTime();
        // 当前系统日期的毫米值;即 从1970-1-1 到现在的毫米值
        long t2 = new Date().getTime();
        // 获取两个时间的差值
        long t = t2 - t1; // 毫秒 
        // 分钟
        long minute = t / 1000 / 60;
        if (t2 < t1)
            return "未来时间";
        if (minute / 60 / 24 / 30 / 12 >= 1)
            return minute / 60 / 24 / 30 / 12 + "年前";
        else if (minute / 60 / 24 / 30 >= 1)
            return minute / 60 / 24 / 30 + "月前";
        else if (minute / 60 / 24 >= 1)
            return minute / 60 / 24 + "天前";
        else if (minute / 60 >= 1)
            return minute / 60 + "小时前";
        else if (minute > 5)
            return minute + "分钟前";
        else
            return "刚刚";
    }


}
